3.6.8.20 l1bmd-分配
L1BMからサイクルあたり 64 長語を読み出し、配下の 64 個のPEに分配し、サイクルあたり 1 長語で書き込む。
L1BMアドレス上ではMAB番号が外側、PE番号が内側に対応する。
つまり、C言語の多次元配列風に書くと[16 (MAB番号)][4 (PE番号)]という並びになる。
この際、L1BM上のデータは 4 長語ごとに異なるMABに送られることになるが、行き先のMAB番号をラウンドロビンにずらすことができる。
なお 2 長語動作の分配命令は存在しない。
code:文法
l1bmd[] $lb<addr_b> <dst_0> <dst_1>..
<dst_0> [<dst_1>..]は書き込み先PEオペランドである。
[]は+か-の後に 0 から 15 の整数を付け、MAB番号をずらす量を指定する。正の場合でも符号は必須である。
番ずれたMABに、未指定であれば送信されるはずだったデータが送られるという対応関係になる。
MAB番号をずらす機能は折り返し転送でも有効である。
この際、対になる結合命令(3.6.8.21 l1bmd-結合)と分配命令でMAB番号をずらす量は一致していなければならない。
この機能は結合命令で折り返しレジスタに書き込む際には適用されないので、折り返しの結果 2 倍ずれてしまうということにはならない。
L1BMアドレス<addr_b>は 64 長語アラインである必要がある。
code:効果
for cycle= 0:4
forall group,l2b,l1b
uint_t src_addr=addr_b +cycle* 64
LongWord data64 = MEMgroupl2bl1b.l1bmsrc_addr:src_addr+64
forall mab,pe
uint_t src_mab = (mab+ mabdiff) % 16
MEMgroupl2bl1bmabpe.refer_pemem(dst,cycle) =datasrc_mab* 4 +pe
code:例
lpassa $mabid $lr0v
nop
l1bmd+1 $lr0v $lb0
l1bmd-1 $lr0v $lb256;l1bmd+1$lbi $ls0v
l1bmd-1 $lbi $ls8v
nop
l1bmd $lb0 $ls16v
l1bmd $lb256 $ls24v
折り返し転送の解説のため、3.6.8.21 l1bmd-結合で述べる結合命令も含めた例とした。
0 番MABの$ls0, $ls8, $ls16, $ls24にはそれぞれ 15 , 1 , 15 , 1 が入る。
前者 2 つでは折り返し分配時にMAB番号をずらす機能が適用されており、後者 2 つでは$lb0, $lb256への結合書き込み時に同機能が適用されている。